package com.ce.util;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.omg.CORBA.portable.ApplicationException;

import com.ce.framework.datamaintain.logic.ISQLMapper;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.StringUtil;
import com.ce.sys.login.model.User;
import com.ce.sys.org.dao.po.SysVOrg;
import com.ce.sys.person.dao.po.SysPerson;


/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2013-9-16 上午11:09:55
 * 功能描述：机构的通用工具类
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class OrgUtil {

	public static final String ORG_SESSION_ID = "rootOrg";
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-16 上午11:10:16
	 * 功能描述：获取当前服务器所属机构信息
	 * 方法的参数和返回值
	 * @return
	 * @throws ApplicationException
	 * @throws AppException
	 * SysVOrg 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static SysVOrg getRootOrg(){
		SysVOrg org = getOrg(RegeditUtil.getRegeditStringValue(RegeditUtil.SYSTEM_SEG_ID));
		return org;
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-21  上午11:15:51
	 * 功能描述：获取当前服务器所属机构的ID
	* 方法的参数和返回值: 
	* @return
	*/
	public static String getRootOrgId(){
		return RegeditUtil.getRegeditStringValue(RegeditUtil.SYSTEM_SEG_ID);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-21  上午11:16:01
	 * 功能描述：获取当前服务器所属机构的名称
	* 方法的参数和返回值: 
	* @return
	*/
	public static String getRootOrgName(){
		SysVOrg org = getRootOrg();
		if(org==null)
			return null;
		return org.getVcName();
	}

	/**
	 * 开发人： andy
	 * 开发时间： 2012-3-10 下午3:53:41
	 * 功能描述：获取当前服务器所属机构的标记，1部，3局，5段，6车间，7工区
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static String getRootOrgFlag(){
		SysVOrg org = getRootOrg();
		if(org==null)
			return null;
		return org.getVcType();
	}

	public static int getRootOrgFlagInt(){
		SysVOrg org = getRootOrg();
		if(org==null)
			return -1;
		return Integer.parseInt(org.getVcType());
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-3 上午08:42:04
	 * 功能描述：根据主键获取机构对象
	 * 方法的参数和返回值
	 * @param pk
	 * @return
	 * @throws AppException
	 * SysVOrg 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static SysVOrg getOrg(String pk){
		if(pk==null){
			return null;
		}
		SysVOrg org = null;
		org = (SysVOrg)DbUtil.getPOByPk(SysVOrg.class.getName(), pk);
		return org;
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:47:27
	* 功能描述: 
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgName(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		return org.getVcName();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:48:44
	* 功能描述: 获取组织机构的类型 1部 2集团 3局 4分局 5段 6车间 7工区 科室为空
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgType(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		return org.getVcType();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:51:54
	* 功能描述: 获取机构所归属的机构ID，局科室返回局ID，段科室返回段ID，车间和工区返回本机构ID
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgManProId(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		if(StringUtil.isBlank(org.getVcType())){
			return getOrgManProId(org.getVcParOrgid());
		}
		return org.getVcId();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:51:54
	* 功能描述: 获取机构所归属的机构ID，局科室返回局ID，段科室返回段ID，车间和工区返回本机构ID
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgManProName(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		if(StringUtil.isBlank(org.getVcType())){
			return getOrgManProName(org.getVcParOrgid());
		}
		return org.getVcName();
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:53:15
	* 功能描述: 获取机构所归属的机构ID，局科室返回局类型3，段科室返回段类型5，车间和工区返回本机构类型6或7
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgManProType(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		if(StringUtil.isBlank(org.getVcType())){
			return getOrgManProType(org.getVcParOrgid());
		}
		return org.getVcType();
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:54:20
	* 功能描述: 获取机构所归属的机关ID，局科室返回局ID，段科室及下属车间工区返回段ID
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgManId(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		if(StringUtil.isBlank(org.getVcType())||Integer.parseInt(org.getVcType())>5){
			return getOrgManProId(org.getVcParOrgid());
		}
		return org.getVcId();
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午05:55:54
	* 功能描述: 获取机构所归属的机关类型，局科室返回局类型3，段科室及下属车间工区返回段类型5
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static String getOrgManType(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		if(StringUtil.isBlank(org.getVcType())||Integer.parseInt(org.getVcType())>5){
			return getOrgManProType(org.getVcParOrgid());
		}
		return org.getVcType();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午06:00:12
	* 功能描述: 获取该机构的所有下级机构
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	@SuppressWarnings("unchecked")
	public static List<SysVOrg> getChildOrg(String vcId){
		return (List<SysVOrg>) DbUtil.executeHql("from SysVOrg po where po.vcParOrgid='"+vcId+"' order by nvl(po.vcType,'5'),po.nseq");
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午06:01:38
	* 功能描述: 获取该机构的所有下级机构，递归查找子机构
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static List<SysVOrg> getAllChildOrg(String vcId){
		String sql="select * from (select * from SYS_V_ORG$DEP T start with VC_ID = '"+vcId+"' connect by vc_par$orgid=prior vc_id) t order by VC_MAN$PRO$TYPE,n_seq";
		List list = DbUtil.executeSqlQuery(sql,new ISQLMapper(){
			public SysVOrg fromSQLQuery(ResultSet rs, int row) {
				SysVOrg view = new SysVOrg();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcNumber(rs.getString("VC_NUMBER"));
					view.setVcOrgLevel(rs.getString("VC_ORG$LEVEL"));
					view.setNseq(rs.getInt("N_SEQ"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setVcType(rs.getString("VC_TYPE"));
					view.setVcDesc(rs.getString("VC_DESC"));
					view.setVcFlagLeaf(rs.getString("VC_FLAG$LEAF"));
					view.setVcParOrgid(rs.getString("VC_PAR$ORGID"));
					view.setVcOrgTypeFlag(rs.getString("vc_org$type$flag"));
					view.setNid(rs.getInt("N_ID"));			
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});
		return list;
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午06:10:18
	* 功能描述: 获取该机构的所有下级科室
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	public static List<SysVOrg> getChildDep(String vcId){
		return (List<SysVOrg>)DbUtil.executeHql("from SysVOrg po where po.vcType='2' and po.vcParOrgid='"+vcId+"' order by po.nseq");
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午06:10:15
	* 功能描述: 获取该机构的所有下级局级机构
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	@SuppressWarnings("unchecked")
	public static List<SysVOrg> getChildPro(String vcId){
		return (List<SysVOrg>) DbUtil.executeHql("from SysVOrg po where po.vcType='1' and po.vcParOrgid='"+vcId+"'");
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午06:01:38
	* 功能描述: 获取该机构的所有下级机构（生产机构），递归查找子机构
	* 方法的参数和返回值: 
	* @param vcId
	* @return
	*/
	@SuppressWarnings("unchecked")
	public static List<SysVOrg> getAllChildPro(String vcId){
		String sql="select * from (select * from SYS_V_ORG$DEP T start with VC_ID = '"+vcId+"' connect by vc_par$orgid=prior vc_id) t where vc_org$type$flag!='3' order by vc_org$type$flag,vc_type,n_seq";
		List<?> list = DbUtil.executeSqlQuery(sql,new ISQLMapper(){
			public SysVOrg fromSQLQuery(ResultSet rs, int row) {
				SysVOrg view = new SysVOrg();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcNumber(rs.getString("VC_NUMBER"));
					view.setVcOrgLevel(rs.getString("VC_ORG$LEVEL"));
					view.setNseq(rs.getInt("N_SEQ"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setVcType(rs.getString("VC_TYPE"));
					view.setVcDesc(rs.getString("VC_DESC"));
					view.setVcFlagLeaf(rs.getString("VC_FLAG$LEAF"));
					view.setVcParOrgid(rs.getString("VC_PAR$ORGID"));
					view.setVcOrgTypeFlag(rs.getString("vc_org$type$flag"));
					view.setNid(rs.getInt("N_ID"));			
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});
		return (List<SysVOrg>) list;
	}

	/**
	*  开发人：andy <BR/>
	* 开发日期: 2013-10-20  下午05:45:26<BR/>
	* 功能描述: 根据组织机构ID获取它上级机构ID<BR/>
	* 方法的参数和返回值: <BR/>
	* @param vcId
	* @return
	*/
	public static SysVOrg getParOrg(String vcId){
		SysVOrg org = getOrg(vcId);
		if(org==null){
			return null;
		}
		return getOrg(org.getVcParOrgid());
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  下午02:07:05
	* 功能描述: 根据级别获取上级机构名称
	* 方法的参数和返回值: 
	* @param vcOrgLevel 1 市局 2 分局3 征管局
	* @return
	*/
	public static String getOrgIdByUserId(String vcPersonId){
		String sql="select t.vc_org$id from SYS_T_PERSON t where t.vc_id='"+vcPersonId+"'";
		String orgName=DbUtil.getFirstStringSqlQuery(sql);
		return orgName;
	}
	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  下午02:07:05
	* 功能描述: 根据级别获取上级机构机构id
	* 方法的参数和返回值: 
	* @param vcOrgLevel 1 市局 2 分局3 征管局
	* @return
	*/
	public static String getOrgNameByUserId(String vcPersonId){
		String vcOrgId=getOrgIdByUserId(vcPersonId);		
		String sql="select t.vc_name from SYS_T_ORG t where t.vc_id='"+vcOrgId+"'";
		String orgId=DbUtil.getFirstStringSqlQuery(sql);
		return orgId;
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-11  上午08:20:35
	* 功能描述: 根据用户ID获取用户的姓名
	* 方法的参数和返回值: 
	* @param userId
	* @return
	*/
	public static String getUserName(String userId){
		if("super".equals(userId)){
			return "超级管理员";
		}
		return DbUtil.getFirstStringSqlQuery("select vc_name from sys_t_person where vc_id='"+userId+"'");
	}
	/**
	 * 获取vcOrgId下所有的人员
	 * @param vcOrgId
	 * @param isAcount  是否系统用户
	 * @return
	 */
	public static List<SysPerson> getUserByOrgId(String vcOrgId,boolean isAcount){
		List<SysPerson> persons=new ArrayList<SysPerson>();
		String sql="from SysPerson p where p.vcOrgId='"+vcOrgId+"' and p.vcDelFlag='0'";
		if(isAcount){
			sql=sql+" and p.vcStatus='1'";
		}
		persons=(List<SysPerson>) DbUtil.executeHql(sql);
		return persons;
	}
	/**
	 * 获取vcOrgId下所有的人员
	 * @param vcOrgId
	 * @param isAcount  是否系统用户
	 * @return
	 */
	public static List<SysPerson> getDefaultUserReceiveCaseByOrgId(String vcParOrgId){
		String sql2="select t.vc_id,vc_name from sys_t_person t where t.vc_del$flag='0' and t.vc_default='1' and t.vc_org$id in(select vc_id from sys_v_org$dep p where p.vc_par$orgid='"+vcParOrgId+"') ";
		List<SysPerson> list = DbUtil.executeSqlQuery(sql2,new ISQLMapper(){
			public SysPerson fromSQLQuery(ResultSet rs, int row) {
				SysPerson view = new SysPerson();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcName(rs.getString("VC_NAME"));					
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});		
		
		return list;
	}
	
}
